﻿@page "/tests/datagrid/editing/batch-editing"
<Row>
    <Column>
        <Card Margin="Margin.Is4.OnY">
            <CardHeader>
                <CardTitle>Datagrid: Batch Editing</CardTitle>
            </CardHeader>
            <CardBody>
                <Paragraph>
                    Allows you to batch edit by allowing the user to edit multiple rows and then save all the changes at once.
                </Paragraph>
                <Field>
                    <FieldLabel>
                        Edit Mode
                    </FieldLabel>
                    <FieldBody>
                        <Select @bind-SelectedValue="@editMode">
                            <SelectItem Value="DataGridEditMode.Form">Form</SelectItem>
                            <SelectItem Value="DataGridEditMode.Inline">Inline</SelectItem>
                            <SelectItem Value="DataGridEditMode.Popup">Popup</SelectItem>
                            <SelectItem Value="DataGridEditMode.Cell">Cell</SelectItem>
                        </Select>
                    </FieldBody>
                </Field>
            </CardBody>

            <CardBody>
                <DataGrid @ref=dataGridRef
                          TItem="Employee"
                          Data="inMemoryData"
                          Responsive
                          ShowPager
                          ShowPageSizes
                           @bind-SelectedRow="@selectedEmployee"
                          Editable
                           EditMode="@editMode"
                          BatchEdit
                           BatchChange="OnBatchChange"
                           BatchSaving="OnBatchSaving"
                           BatchSaved="OnBatchSaved"
                           BatchEditCellStyling="OnCellBatchEditStyling"
                           RowBatchEditStyling="(x, y ) => OnRowBatchEditStyling(x,y)"
                          UseValidation
                           ValidationsSummaryLabel="The following validation errors have occurred..."
                          ShowValidationsSummary>
                    <DataGridColumns>
                        <DataGridCommandColumn>
                            <SaveBatchCommandTemplate>
                                <Button Background=Background.Info Size=Size.Small Clicked="@context.Clicked">Save Changes (@batchQuantity.ToString())</Button>
                                </SaveBatchCommandTemplate>
                                <CancelBatchCommandTemplate>
                                    <Button Background=Background.Light Size=Size.Small Clicked="@context.Clicked">Cancel Changes</Button>
                                </CancelBatchCommandTemplate>
                            </DataGridCommandColumn>
                            <DataGridColumn TextAlignment="TextAlignment.Center" TItem="Employee" Field="@nameof( Employee.Id )" Caption="#" Width="60px" />
                            <DataGridColumn TItem="Employee" Field="@nameof( Employee.FirstName )" Caption="First Name" Editable />
                         <DataGridColumn TItem="Employee" Field="@nameof( Employee.LastName )" Caption="Last Name" Editable />
                         <DataGridColumn TItem="Employee" Field="@nameof( Employee.Email )" Caption="Email" Editable />
                         <DataGridColumn TItem="Employee" Field="@nameof( Employee.City )" Caption="City" Editable>
                            <CaptionTemplate>
                                <Icon Name="IconName.City" /> @context.Caption
                            </CaptionTemplate>
                        </DataGridColumn>
                        <DataGridColumn TItem="Employee" Field="@nameof( Employee.Zip )" Caption="Zip">
                        </DataGridColumn>
                        <DataGridDateColumn TItem="Employee" Field="@nameof( Employee.DateOfBirth )" DisplayFormat="{0:dd.MM.yyyy}" Caption="Date Of Birth" Editable />
                         <DataGridNumericColumn TItem="Employee" Field="@nameof( Employee.Childrens )" Caption="Childrens" Editable Filterable="false" />
                         <DataGridSelectColumn TItem="Employee" Field="@nameof( Employee.Gender )" Caption="Gender" Editable Data="EmployeeData.Genders" ValueField="(x) => ((Gender)x).Code" TextField="(x) => ((Gender)x).Description" />
                         <DataGridColumn TItem="Employee" Field="@nameof( Employee.Salary )" Caption="Salary" Editable Width="140px" DisplayFormat="{0:C}" DisplayFormatProvider="@System.Globalization.CultureInfo.GetCultureInfo("fr-FR")" TextAlignment="TextAlignment.End">
                         </DataGridColumn>
                         <DataGridCheckColumn TItem="Employee" Field="@nameof(Employee.IsActive)" Caption="Active" Editable Filterable="false">
                             <DisplayTemplate>
                                 <Check TValue="bool" Checked="context.IsActive" Disabled ReadOnly />
                             </DisplayTemplate>
                         </DataGridCheckColumn>
                     </DataGridColumns>
                 </DataGrid>
             </CardBody>
         </Card>
     </Column>
 </Row>

 @code {

    [Inject] EmployeeData EmployeeData { get; set; }

    private int batchQuantity = 0;
    private DataGrid<Employee> dataGridRef;
    private List<Employee> inMemoryData;
    private Employee selectedEmployee;
    private DataGridEditMode editMode = DataGridEditMode.Form;

    protected override async Task OnInitializedAsync()
    {
        inMemoryData = ( await EmployeeData.GetDataAsync().ConfigureAwait( false ) ).Take( 25 ).ToList();
        await base.OnInitializedAsync();
    }

    private Task OnBatchChange( DataGridBatchChangeEventArgs<Employee> args )
    {
        Console.WriteLine( "Batch Change" );
        batchQuantity = dataGridRef.BatchChanges.Count;
        return Task.CompletedTask;
    }

    private Task OnBatchSaving( DataGridBatchSavingEventArgs<Employee> args )
    {
        Console.WriteLine( "Batch Saving" );
        return Task.CompletedTask;
    }

    private Task OnBatchSaved( DataGridBatchSavedEventArgs<Employee> args )
    {
        Console.WriteLine( "Batch Saved" );
        batchQuantity = 0;
        return Task.CompletedTask;
    }

    private void OnRowBatchEditStyling( DataGridBatchEditItem<Employee> batchEditItem, DataGridRowStyling cellStyling )
    {
        if ( batchEditItem.State == DataGridBatchEditItemState.Delete )
        {
            cellStyling.Background = Background.Secondary;
        }
    }

    private void OnCellBatchEditStyling( DataGridBatchEditItem<Employee> batchEditItem, DataGridColumn<Employee> column, DataGridCellStyling cellStyling )
    {
        if ( batchEditItem.State == DataGridBatchEditItemState.Edit && batchEditItem.IsModified( column.Field ) )
        {
            cellStyling.Background = Background.Light;
            cellStyling.TextColor = TextColor.Success;
        }
    }
}